// 代理模式
// 代理模式为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介的作用。
// 目标对象接口  
class Subject {  
    request() {  
      throw new Error('子类必须实现 request 方法');  
    }  
  }  
    
  // 真实对象  
  class RealSubject extends Subject {  
    constructor(data){
        super();
        this.data=data
    }
    request(data) {  
        if(data){
            console.log('RealSubject: Handling the actual request.',data);  
        }else{
            console.log('RealSubject: Handling the actual request.');  
        }
      // 这里可以放置一些实际的处理逻辑  
    }  
  }  
    
  // 代理对象  
  class Proxy extends Subject {  
    constructor(realSubject) {  
    super();
    this.realSubject = realSubject;  
    }  
    
    request() {  
      // 添加日志记录和性能监控的额外逻辑  
      console.log('Proxy: Logging the start of the request.');  
      const startTime = Date.now();  
    
      // 转发请求给真实对象  
      this.realSubject.request();  
    
      // 计算并输出处理时间  
      const endTime = Date.now();  
      let data=endTime +1 - startTime
    // 转发请求给真实对象  
    this.realSubject.request(data); 
      console.log(`Proxy: Logging the end of the request. Time taken: ${endTime - startTime}ms`);  
    }  
  }  
    
  // 使用代理模式  
  const realSubject = new RealSubject();  
  const proxy = new Proxy(realSubject);  
  proxy.request();


// 总结：
// 代理对象不会修改 RealSubject 类的内部实现。
// 代理对象在 RealSubject 实例的外部添加额外的功能。（即是新增加的功能并不属于 RealSubject 实例。
// 这些额外的功能是通过代理对象的方法调用实现的，这些方法在转发请求给 RealSubject 实例之前或之后执行。
// RealSubject 实例本身不知道这些额外的逻辑，它只是按照其原始设计响应调用。